// 消息类型定义
export enum MessageType {
  // 用户相关
  USER_LOGIN = 'USER_LOGIN',
  USER_LOGOUT = 'USER_LOGOUT',
  USER_INFO_UPDATE = 'USER_INFO_UPDATE',

  // 权限相关
  PERMISSION_UPDATE = 'PERMISSION_UPDATE',
  ROLE_UPDATE = 'ROLE_UPDATE',

  // 主题相关
  THEME_CHANGE = 'THEME_CHANGE',
  LOCALE_CHANGE = 'LOCALE_CHANGE',

  // 菜单相关
  MENU_COLLAPSE = 'MENU_COLLAPSE',
  MENU_EXPAND = 'MENU_EXPAND',

  // 路由相关
  ROUTE_CHANGE = 'ROUTE_CHANGE',

  // 应用相关
  APP_MOUNT = 'APP_MOUNT',
  APP_UNMOUNT = 'APP_UNMOUNT',
  APP_ERROR = 'APP_ERROR',

  // 自定义消息
  CUSTOM = 'CUSTOM',
}

// 消息接口
export interface Message {
  type: MessageType;
  data: any;
  timestamp: number;
  from: string;
  to?: string; // 目标应用，不指定则广播
}

// 消息监听器接口
export interface MessageListener {
  (message: Message): void;
}

// 消息服务类
class MessageService {
  private listeners: Map<string, Set<MessageListener>> = new Map();

  private messageQueue: Message[] = [];

  private isInitialized = false;

  private appName = 'login-app';

  constructor() {
    this.init();
  }

  // 初始化消息服务
  private init() {
    if (this.isInitialized) return;

    // 监听来自其他应用的消息
    window.addEventListener('message', this.handleWindowMessage.bind(this));

    // 监听自定义事件
    window.addEventListener('micro-app-message', this.handleCustomMessage.bind(this));

    this.isInitialized = true;
    console.log('[LoginApp MessageService] Initialized');
  }

  // 设置当前应用名称
  setAppName(name: string) {
    this.appName = name;
  }

  // 发送消息到指定应用
  sendMessage(to: string, type: string, data: any) {
    const message: Message = {
      type: type as MessageType,
      data,
      timestamp: Date.now(),
      from: this.appName,
      to,
    };

    this.deliverMessage(message);
  }

  // 广播消息到所有应用
  broadcast(type: string, data: any) {
    const message: Message = {
      type: type as MessageType,
      data,
      timestamp: Date.now(),
      from: this.appName,
    };

    this.deliverMessage(message);
  }

  // 监听消息
  onMessage(type: string, listener: MessageListener): () => void {
    if (!this.listeners.has(type)) {
      this.listeners.set(type, new Set());
    }

    this.listeners.get(type)!.add(listener);

    // 返回取消监听的函数
    return () => {
      this.offMessage(type, listener);
    };
  }

  // 取消监听
  offMessage(type: string, listener?: MessageListener) {
    if (!this.listeners.has(type)) return;

    if (listener) {
      this.listeners.get(type)!.delete(listener);
    } else {
      this.listeners.get(type)!.clear();
    }
  }

  // 投递消息
  private deliverMessage(message: Message) {
    try {
      // 如果是在微应用中，通过 postMessage 发送到主应用
      if (window.__POWERED_BY_QIANKUN__ && window.parent !== window) {
        window.parent.postMessage(
          {
            type: 'micro-app-message',
            payload: message,
          },
          '*',
        );
      } else {
        // 在独立运行时，通过自定义事件广播
        const event = new CustomEvent('micro-app-message', {
          detail: message,
        });
        window.dispatchEvent(event);
      }

      // 本地处理消息
      this.handleMessage(message);
    } catch (error) {
      console.error('[LoginApp MessageService] Failed to deliver message:', error);
    }
  }

  // 处理 window.postMessage
  private handleWindowMessage(event: MessageEvent) {
    if (event.data?.type === 'micro-app-message' && event.data?.payload) {
      this.handleMessage(event.data.payload);
    }
  }

  // 处理自定义事件
  private handleCustomMessage(event: CustomEvent) {
    if (event.detail) {
      this.handleMessage(event.detail);
    }
  }

  // 处理消息
  private handleMessage(message: Message) {
    // 检查消息是否是发给当前应用的
    if (message.to && message.to !== this.appName) {
      return;
    }

    // 避免处理自己发送的消息
    if (message.from === this.appName) {
      return;
    }

    // 触发监听器
    const listeners = this.listeners.get(message.type);
    if (listeners) {
      listeners.forEach((listener) => {
        try {
          listener(message);
        } catch (error) {
          console.error('[LoginApp MessageService] Listener error:', error);
        }
      });
    }

    // 记录消息到队列（用于调试）
    this.messageQueue.push(message);

    // 限制队列大小
    if (this.messageQueue.length > 100) {
      this.messageQueue.shift();
    }
  }

  // 获取消息历史
  getMessageHistory(): Message[] {
    return [...this.messageQueue];
  }

  // 清空消息历史
  clearMessageHistory() {
    this.messageQueue = [];
  }

  // 销毁服务
  destroy() {
    window.removeEventListener('message', this.handleWindowMessage.bind(this));
    window.removeEventListener('micro-app-message', this.handleCustomMessage.bind(this));
    this.listeners.clear();
    this.messageQueue = [];
    this.isInitialized = false;
  }
}

// 创建单例实例
export const messageService = new MessageService();

export default messageService;
